package com.hollycrm.hollysqm.job.synchro;

import java.sql.CallableStatement;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.CallableStatementCallback;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import com.dangdang.ddframe.job.api.JobExecutionMultipleShardingContext;
import com.dangdang.ddframe.job.plugin.job.type.simple.AbstractSimpleElasticJob;
import com.hollycrm.hollysqm.entities.TblJobIndex;
import com.hollycrm.hollysqm.job.synchro.dao.SynchroI8DbJobDao;

/**
 * 同步存储过程，将i8接触记录数据定时抽取到质检表中
 * @author jianglong
 * @date 2017年2月23日 上午11:13:39
 */
@Service
public class SynchroI8DbJob extends AbstractSimpleElasticJob {
	

	private final Logger log = LoggerFactory.getLogger(getClass());
	
	@Autowired
	private JdbcTemplate jdbTemplate;
	
	@Autowired
	private SynchroI8DbJobDao synchroI8DbJobDao;
	
	/**
	 * 主方法
	 */	
	@Override
	public void process(JobExecutionMultipleShardingContext shardingContext) {
		log.info("开始执行SynchroI8DbJob...");
		List<TblJobIndex> jobList = synchroI8DbJobDao.getJobIndexList();
		execute(jobList.get(0));
		log.info("结束执行SynchroI8DbJob...");
	}
	
	/**
	 * 执行存储过程，将I8聊天数据同步到质检备份表中
	 * @param shardingContext
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public void execute(TblJobIndex jobIndex){
		String exeTime = jobIndex.getExeTime();
		int circle = jobIndex.getCircle();
		if (StringUtils.isBlank(exeTime)){
			log.error("jobParameter参数格式有误，需为格式：yyyyMMddHH 或 yyyyMMddHHmm");
			return ;
		}
		
		String tempTime = null;
		try{
			if (exeTime.length() == 10){
				//如果是小时，则获取每小时的数据
				Date date = DateUtils.addHours(DateUtils.parseDate(exeTime, new String[]{"yyyyMMddHH"}), 1);
				tempTime = DateFormatUtils.format(date, "yyyyMMddHH") ;
			}else if (exeTime.length() == 12){
				//如果是分钟，则获取每10分钟内的数据
				Date date = DateUtils.addMinutes(DateUtils.parseDate(exeTime, new String[]{"yyyyMMddHHmm"}), 10);
				tempTime = DateFormatUtils.format(date, "yyyyMMddHHmm");
			}else {
				log.error("jobParameter参数格式有误，需为格式：yyyyMMddHH 或 yyyyMMddHHmm");
				return ;
			}
		}catch(NumberFormatException nfe){
			log.error("同步i8数据库接触记录表Job异常,时间字符串转数字失败！...",nfe);
		}catch(ParseException pe){
			log.error("同步i8数据库接触记录表信息异常,时间字符串格式解析失败！...",pe);
		}
		String time = (tempTime.length()==10?"0000":"00");
		final String startTime = exeTime + time;
		final String endTime = tempTime + time;
		int count=0;
		String sql = "{call prc_syn_i8_sessionquery(?,?)}";// 调用的存储过程
		try{
			Object obj = jdbTemplate.execute(sql, new CallableStatementCallback() {
				@Override
				public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
					cs.setString(1, startTime);// 设置输入参数的值:执行时间
					cs.setString(2, endTime);
//					cs.registerOutParameter(3,OracleTypes.NUMBER);// 注册输出参数的类型 
					cs.execute();
//					return cs.getInt(3);
					return 1;
				}
			});
			circle = 0;
			exeTime = tempTime;
			count= obj!=null?((Integer)obj).intValue():0;			
		}catch(Exception e){
			log.error("同步i8数据库接触记录表Job异常...",e);
			count = 0;
			circle ++ ; 
			return ;
		}finally{
			log.info("prc_syn_i8_sessionquery存储过程已成功执行，时间段【"+startTime+"-"+endTime+"】,受影响行："+count);
			synchroI8DbJobDao.updateJobIndex(exeTime, circle);//重置下一轮的时间；
		}
		
//		//重新组装需抽取时间格式到Job参数中：（开始时间）yyyyMMddHHmmss-（结束时间）yyyyMMddHHmmss
//		try{
//			Date s = DateUtils.parseDate(startTime, new String[]{"yyyyMMddHHmmss"});
//			Date e = DateUtils.parseDate(endTime, new String[]{"yyyyMMddHHmmss"});
//			int time = (int) (e.getTime() - s.getTime()) / 1000; //求时间差；			
//			Date newDate = DateUtils.addSeconds(DateUtils.parseDate(endTime, new String[]{"yyyyMMddHHmmss"}), time);
//			//生成下一轮抽取数据的时间范围：
//			shardingContext.setJobParameter(String.format("%s-%s",endTime,DateFormatUtils.format(newDate, "yyyyMMddHHmmss")));			
//		}catch(NumberFormatException nfe){
//			log.error("同步i8数据库接触记录表Job异常,时间字符串转数字失败！...",nfe);
//		}catch(ParseException pe){
//			log.error("同步i8数据库接触记录表信息异常,时间字符串格式解析失败！...",pe);
//		}
	}
	
}
